import pandas as pd
from pandas import DataFrame
from pyecharts.charts import Bar
from pyecharts import options as opts


def add_change(df: DataFrame) -> DataFrame:
    # 假设原始 DataFrame 名为 df
    df['change'] = (df['close'].shift(-1) - df['close']) / df['close'] * 100

    # 可选：处理最后一行（如果不需要可以省略）
    # 方法1：最后一行设为 NaN（默认行为）
    # 方法2：最后一行设为 0
    df.loc[df.index[-1], 'change'] = 0
    # 方法3：删除最后一行（如果不需要）
    df = df.iloc[:-1]
    return df


def mon_first(df: DataFrame) -> DataFrame:
    # 先添加一个辅助列表示年月
    df['year_month'] = df['date'].dt.to_period('M')
    # 找出每个年月组中的第一天（即最小日期）
    monthly_first = df.loc[df.groupby('year_month')['date'].idxmin()].reset_index(drop=True)
    # 删除辅助列
    monthly_first = monthly_first.drop(columns=['year_month'])
    return monthly_first


def get_data(path: str) -> DataFrame:
    # 计算每个月差值 生成图表
    df_data: DataFrame = pd.read_excel(path)
    df_data = df_data[['日期Date', '收盘Close']]
    df_data.rename(columns={
        '日期Date': 'date',
        '收盘Close': 'close'
    }, inplace=True)
    return df_data


def print_bar(index_code, merge):
    bar = Bar()
    bar.add_xaxis(merge['date'].dt.strftime('%Y%m%d').tolist())  # 添加横轴
    bar.add_yaxis("y", merge['fix'].tolist(), label_opts=opts.LabelOpts(is_show=False))
    bar.set_global_opts(
        xaxis_opts=opts.AxisOpts(
            type_="category",  # 使用分类轴
            axislabel_opts=opts.LabelOpts(formatter=lambda x: x.strftime('%Y-%m'))  # 格式化日期
        )
    )
    bar.set_global_opts(
        tooltip_opts=opts.TooltipOpts(trigger='item', formatter="{b}: {c}"))
    # 纵轴的前面是相于一个标签，这两个标签可以切换
    bar.render(index_code + "_day.html")  # 这里我指定了我的存放路径和文件名


def print_year(index_code, merge):
    temp_df = merge[['date', 'fix']]
    print(temp_df)
    pass


def main_fun(index_code: str) -> None:
    # 计算每个月差值 生成图表
    zz500: DataFrame = get_data(index_code + "perf.xlsx")
    zz500['date'] = pd.to_datetime(zz500['date'].astype(str), format='%Y%m%d')
    zz500j: DataFrame = get_data(index_code + "jin_perf.xlsx")
    zz500j['date'] = pd.to_datetime(zz500j['date'].astype(str), format='%Y%m%d')
    # mon_first_zz500 = mon_first(zz500)
    mon_first_zz500 = zz500
    print(mon_first_zz500.head())
    change_zz500 = add_change(mon_first_zz500)
    # mon_first_zz500j = mon_first(zz500j)
    mon_first_zz500j = zz500j
    print(mon_first_zz500j.head())

    change_zz500j = add_change(mon_first_zz500j)
    change_zz500j.rename(columns={'close': 'closej', 'change': 'changej'}, inplace=True)
    merge = change_zz500.merge(change_zz500j, on='date', how='left')
    merge['fix'] = (merge['changej'] - merge['change']).round(2)
    print_bar(index_code, merge)
    print_year(index_code, merge)


if __name__ == '__main__':
    # main_fun("000905")
    # main_fun("000300")
    main_fun("000016")

